package com.atguigu.common.utils;

import com.atguigu.common.vo.BaseTreeVo;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 树形结构工具
 *
 * @author gaozz
 * @date 2022-11-01 23:16:24
 */
public class BaseTreeUtils {

    /**
     * 获取树形结构
     *
     * @param allList 树形列表
     * @param <T>     泛型
     * @return 树形结构
     */
    public static <T extends BaseTreeVo> List<T> listTreeNodes(List<T> allList) {
        // 创建一级分类集合
        List<T> parentList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(allList)) {
            // 过滤出所有的一级分类
            parentList = allList.stream().filter(item -> item.getParentCid() == 0).collect(Collectors.toList());
        }
        //返回的树形节点数据
        if (!CollectionUtils.isEmpty(parentList)) {
            for (T parentNode : parentList) {
                //递归查询所有子节点
                parentNode.setChildren(recursiveTree(parentNode, allList));
            }
        }
        return parentList;
    }

    /**
     * 递归算法解析成树形结构
     *
     * @param parentNode   父级对象
     * @param classifyList 集合
     * @param <T>          泛型
     * @return 树形结构
     */
    public static <T extends BaseTreeVo> List<T> recursiveTree(T parentNode, List<T> classifyList) {
        List<T> childList = new ArrayList<>();
        //子集的直接子对象
        for (T entity : classifyList) {
            Long parentId = entity.getParentCid();
            if (parentNode.getCatId() == parentId) {
                childList.add(entity);
            }
        }
        //子集的间接子对象
        for (T entity : childList) {
            entity.setChildren(recursiveTree(entity, classifyList));
        }
        //递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
}
